package com.beetlestech.nfe.main.biz.com.impl;
import java.sql.Date;
import java.util.List;

import com.beetlestech.nfe.fw.core.biz.AbstractDBLogic;
import com.beetlestech.nfe.fw.core.type.AutoInject;
import com.beetlestech.nfe.fw.core.util.CollectionUtil;
import com.beetlestech.nfe.fw.core.util.StringUtil;
import com.beetlestech.nfe.main.biz.com.HbComblcmMaster;
import com.beetlestech.nfe.main.biz.com.HbUser;
import com.beetlestech.nfe.main.biz.com.dto.UserInfoDTO;
import com.beetlestech.nfe.main.biz.constant.CommonConstant;
import com.beetlestech.nfe.main.biz.constant.CtgCodeConstant;
import com.beetlestech.nfe.main.biz.constant.HbMessageCode;
import com.beetlestech.nfe.main.db.base.StatementDTO;
import com.beetlestech.nfe.main.db.base.StatementUtil;
import com.beetlestech.nfe.main.db.constant.SQLConstant;
import com.beetlestech.nfe.main.db.constant.SQLID;
import com.beetlestech.nfe.main.db.tbl.MstusrDTO;
import com.beetlestech.nfe.main.db.tbl.TloginlgDTO;
import com.beetlestech.nfe.main.db.tbl.UserjurisdictionDTO;

/**
 * 職員情報取得Bizロジック
 *
 * 変更履歴
 * REV.         変更日付           変更者              変更内容
 * -------      ---------------    ----------------    ------------------
 * 1.0          2013/03/20         GD 夏喜文           新規作成
 * 1.1          2013/06/26         GD 張斌             getStaffList追加
 * 1.2			2013/06/26		   GD 王勇             変更管理No35対応
 * 1.3			2013/07/09		   GD 王勇             getStaffList検証対応
 * 1.4          2013/07/24		   GD 張博             業務委託者リスト取得の追加
 * 1.5          2013/08/14		   GD 賈博             変更管理No67対応
 * 1.6          2013/08/17		   GD 賈博             変更管理No57対応
 * 1.7          2013/08/27		   GD 王勇             変更管理No48対応
 * 1.8          2013/09/10		   GD 賈博             変更管理No74対応
 * 1.9          2013/09/10		   GD 劉志東           欠陥No206対応
 * 2.0          2013/10/24		   GD 賈博             変更管理No114対応
 * 2.1          2014/03/03		   GD 賈博             変更管理No181対応
 * 2.2          2014/05/04		   GD 賈博             欠陥No480対応
 *
*/
public class HbUserImpl extends AbstractDBLogic implements HbUser, CtgCodeConstant, HbMessageCode, CommonConstant, SQLConstant {
	/**
	 * 職員情報データ
	 */
	protected static final String SH_INFO = "職員情報データ";

	/**
	 * APPL_ID:COM
	 */
	protected static final String COM = "COM";

	/**
	 * FUNCTION_ID:ListMaxCount
	 */
	protected static final String LIST_MAX_COUNT = "ListMaxCount";

	/**
	 * ITEM_ID:StaffList
	 */
	protected static final String STAFF_LIST = "StaffList";

	/**
	 * ITEM_ID:AgentList
	 */
	protected static final String AGENT_LIST = "AgentList";

	/**
	 * FUNCTION_ID:Mode
	 */
	protected static final String FUNCTION_ID_MODE = "Mode";

	/**
	 * ITEM_ID:AuthenticationCondition
	 */
	protected static final String ITEM_ID_AUTHENTICATION_CONDITION = "AuthenticationCondition";

	/**
	 * ID種別:0
	 */
	protected static final String ID_TYPE_0 = "0";

	/**
	 * ID種別:1
	 */
	protected static final String ID_TYPE_1 = "1";

	/**
	 * ID種別:2
	 */
	protected static final String ID_TYPE_2 = "2";

	/**
	 * 表示順
	 */
	protected static final String COM_KEY3 = "comKey3";

	/**
	 * ビジネスロジック設定マスター Bizロジック
	 */
	@AutoInject
	protected HbComblcmMaster hbComblcmMaster;

	/* (non-Javadoc)
	 * @see com.beetlestech.nfe.main.biz.com.HbUser#getValidStaffInfo(java.lang.String, java.sql.Date)
	 */
	@Override
	public UserInfoDTO getValidStaffInfo(
			String userName,
			Date date) {

		// 検索条件文字用のDTOを新規する
		StatementDTO statementDTO = new StatementDTO();
		// 職員ID (SH_ID) = 入力値の職員ID（shId）
		StatementUtil.andWhere(statementDTO, MstusrDTO.COLUMN_USERNAME, StatementUtil.KEYWORD.EQUAL, userName);

		//職員基本情報を取得する
		MstusrDTO vstaffm2DTO = new MstusrDTO();
		vstaffm2DTO.set_dynamicWhereCondition(statementDTO.getSQLStatement());
		List<MstusrDTO> vstaffm2DTOs = queryDAO.queryForObjectList(MstusrDTO.SQL_SEARCH, vstaffm2DTO);
		UserInfoDTO userInfo = null;
		if (CollectionUtil.isEmpty(vstaffm2DTOs)) {
			//検出件数が0件の場合
			vstaffm2DTO = null;
		} else if (vstaffm2DTOs.size() > 1) {
			//処理１で2件以上取得できた場合は、「ApplicationException」を返す
			createApplicationException(M10190WS, SH_INFO);
		} else {
			userInfo = setUserInfo(vstaffm2DTOs.get(0));
		}
		//検出データを返す
		return userInfo;
	}

	/* (non-Javadoc)
	 * @see com.beetlestech.nfe.main.biz.com.HbUser#getStaffInfo(java.lang.String, java.sql.Date)
	 */
	@Override
	public UserInfoDTO getStaffInfo(
			int shId,
			Date date) {
		StatementDTO statementDTO = new StatementDTO();
		//職員IDが指定されている場合
		StatementUtil.andWhere(statementDTO, MstusrDTO.COLUMN_USR_ID, StatementUtil.KEYWORD.EQUAL, shId);

		MstusrDTO staffmDTO = new MstusrDTO();
		//検索条件
		staffmDTO.set_dynamicWhereCondition(statementDTO.getSQLStatement());
		//検索結果
		List<MstusrDTO> vstaffmDTOs = queryDAO.queryForObjectList(MstusrDTO.SQL_SEARCH, staffmDTO);
		UserInfoDTO userInfo = null;
		if (CollectionUtil.isEmpty(vstaffmDTOs)) {
			//0件取得した場合、NULLを返す
			staffmDTO = null;
		} else if (vstaffmDTOs.size() > 1) {
			//2件以上取得できた場合は、「ApplicationException」を返す
			createApplicationException(M10190WS, SH_INFO);
		} else {
			//1件取得した場合,取得した「職員基本情報」
			userInfo = setUserInfo(vstaffmDTOs.get(0));
		}
		return userInfo;
	}

	/* (non-Javadoc)
	 * @see com.beetlestech.nfe.main.biz.com.HbUser#getStaffList(java.lang.String, java.lang.String, java.lang.String, java.lang.String,
	 *  java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 
	@Override
	public StaffGetResultDTO getStaffList(
			String shId,
			String shName,
			String shKanaName,
			String kaCd,
			String byotoCd,
			String shKbn,
			String shType,
			String extensionNumber,
			String phsNumber,
			Boolean isNotOverLimit) {

		StaffGetResultDTO staffGetResultDTO = new StaffGetResultDTO();

		// 上限件数を取得
		Integer limitCount = INT_ZERO;
		TcomblcmDTO tcomblcmMaxCountDTO = hbComblcmMaster.getComblcmInfo(COM, LIST_MAX_COUNT, STAFF_LIST);
		if (tcomblcmMaxCountDTO != null) {
			limitCount = NumberUtil.toInt(tcomblcmMaxCountDTO.getValue());
		}

		staffGetResultDTO.setIsOverLimit(false);
		// 入力値「行数制限なし真偽」＝trueの場合
		if (isNotOverLimit == null) {
			isNotOverLimit = false;
		}
		if (isNotOverLimit) {
			// 制限行数は、「0」
			staffGetResultDTO.setOverLimitCount(Integer.valueOf(STR_ZERO));
		} else {
			// 制限行数は、「上限件数」
			staffGetResultDTO.setOverLimitCount(limitCount);
		}

		// 検索条件は指定する場合、検索条件をセットする
		StatementDTO statementDTO = new StatementDTO();

		String[] whereConditon = { shId, shName, shKanaName, kaCd, byotoCd, shKbn, shType, extensionNumber, phsNumber };
		if (!StringUtil.isAllEmpty(whereConditon)) {
			if (shId != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_SH_ID, StatementUtil.KEYWORD.EQUAL, shId);
			}
			if (shName != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_SH_NAME, StatementUtil.KEYWORD.LIKE, shName);
			}
			if (phsNumber != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_TEL2, StatementUtil.KEYWORD.EQUAL, phsNumber);
			}
			if (kaCd != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_KA_CD, StatementUtil.KEYWORD.EQUAL, kaCd);
			}
			if (byotoCd != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_BYOTO_CD, StatementUtil.KEYWORD.EQUAL, byotoCd);
			}
			if (shKbn != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_SH_KBN, StatementUtil.KEYWORD.EQUAL, shKbn);
			}
			if (shType != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_SH_TYPE, StatementUtil.KEYWORD.EQUAL, shType);
			}
			if (extensionNumber != null) {
				StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_TEL1, StatementUtil.KEYWORD.EQUAL, extensionNumber);
			}
			if (shKanaName != null) {
				// カナ大文字への変換を行う
				String upperKanaName = hbComUtility.getKanaToUpper(shKanaName);
				StringBuilder searchConditionForKn = new StringBuilder();
				searchConditionForKn = searchConditionForKn.append(VstaffmDTO.COLUMN_SH_KANA_NAME);
				searchConditionForKn = searchConditionForKn.append(StatementUtil.KEYWORD.LIKE);
				searchConditionForKn = searchConditionForKn.append(QUESTION_MARK);
				searchConditionForKn = searchConditionForKn.append(SQL_OR);
				searchConditionForKn = searchConditionForKn.append(VstaffmDTO.COLUMN_SH_KANA_NAME);
				searchConditionForKn = searchConditionForKn.append(StatementUtil.KEYWORD.LIKE);
				searchConditionForKn = searchConditionForKn.append(QUESTION_MARK);
				StatementUtil.andWhere(statementDTO, searchConditionForKn.toString(), new Object[] { shKanaName, upperKanaName });
			}
		} else {
			// すべての入力値がnullの場合は、セッションより職員IDを取得し、上記検索条件にて検索する
			StatementUtil.andWhere(statementDTO, VstaffmDTO.COLUMN_SH_ID, StatementUtil.KEYWORD.EQUAL, getUserId());
		}

		String conditionStr = statementDTO.getSQLStatement();
		VstaffmDTO vstaffmDTO = new VstaffmDTO();
		vstaffmDTO.set_dynamicWhereCondition(conditionStr);
		vstaffmDTO.set_orderByCondition(VstaffmDTO.COLUMN_SH_ID);
		// 入力値「行数制限なし」!=1の場合
		if (!isNotOverLimit) {

			vstaffmDTO.set_fetchFirstCondition(limitCount.toString());
			// レコードの件数を取得する
			Integer count = queryDAO.count(VstaffmDTO.COUNT_SEARCH, vstaffmDTO);
			if (count > limitCount) {
				staffGetResultDTO.setIsOverLimit(true);
			}
		}

		// 職員ビューリストを検索する
		List<VstaffmDTO> vstaffmDTOs = queryDAO.queryForObjectList(VstaffmDTO.SQL_SEARCH, vstaffmDTO);

		// 職員情報配列を作成する
		StaffInfoDTO[] staffInfoDTOs = new StaffInfoDTO[vstaffmDTOs.size()];
		Integer i = 0;
		for (VstaffmDTO vstaffmDTOInfo : vstaffmDTOs) {
			StaffInfoDTO staffInfoDTO = new StaffInfoDTO();
			staffInfoDTO.setShId(vstaffmDTOInfo.getShId());
			staffInfoDTO.setShName(vstaffmDTOInfo.getShName());
			staffInfoDTO.setShKanaName(vstaffmDTOInfo.getShKanaName());
			staffInfoDTO.setExtensionNumber(vstaffmDTOInfo.getTel1());
			staffInfoDTO.setPhsNumber(vstaffmDTOInfo.getTel2());

			// 職種区分をセットする
			CodeWithValueDTO codeWithValueDTOShKbn = new CodeWithValueDTO();
			String shKbnName = hbComConverter.getShKbnName(vstaffmDTOInfo.getShKbn());
			codeWithValueDTOShKbn.setCode(vstaffmDTOInfo.getShKbn());
			codeWithValueDTOShKbn.setValue(shKbnName);
			staffInfoDTO.setShKbn(codeWithValueDTOShKbn);

			// 職種をセットする
			CodeWithValueDTO codeWithValueDTOShType = new CodeWithValueDTO();
			codeWithValueDTOShType.setCode(vstaffmDTOInfo.getShType());
			codeWithValueDTOShType.setValue(vstaffmDTOInfo.getShTypeNm());
			codeWithValueDTOShType.setValueR(vstaffmDTOInfo.getShTypeNmR());
			staffInfoDTO.setShType(codeWithValueDTOShType);

			// 職員情報を職員情報配列に追加する
			staffInfoDTOs[i] = staffInfoDTO;
			i++;
		}
		staffGetResultDTO.setStaffInfoArray(staffInfoDTOs);

		// 職員情報配列を返す
		return staffGetResultDTO;
	}
*/
	/* (non-Javadoc)
	 * @see com.beetlestech.nfe.main.biz.com.HbUser#getLoginUserInfo(java.lang.String, java.lang.String)
	 */
	@Override
	public UserInfoDTO getLoginUserInfo(
			String loginName, String password,String sesID) {

		//検索条件を作成する
		/*StatementDTO statementDTO = new StatementDTO();
		StatementUtil.leftBracketWhere(statementDTO, MstusrDTO.COLUMN_USERNAME, StatementUtil.KEYWORD.EQUAL, loginName);
		StatementUtil.orWhere(statementDTO, MstusrDTO.COLUMN_PHONE, StatementUtil.KEYWORD.EQUAL, loginName);
		StatementUtil.orWhereWithRightBracket(statementDTO, MstusrDTO.COLUMN_EMAIL, StatementUtil.KEYWORD.EQUAL, loginName);
		StatementUtil.andWhere(statementDTO, MstusrDTO.COLUMN_STATE, StatementUtil.KEYWORD.EQUAL, 1);*/

		MstusrDTO userDTO = new MstusrDTO();
		userDTO.setusername(loginName);
		userDTO.setphone(loginName);
		userDTO.setemail(loginName);
		List<MstusrDTO> userDTOs = queryDAO.queryForObjectList(SQLID.LOGIN_USRE_EQUAL_SEARCH, userDTO);
		
		UserInfoDTO userInfo = null;
		if (CollectionUtil.isEmpty(userDTOs)) {
			//検出件数が0件の場合
			createApplicationException(M00010WC, SH_INFO);
		} else if (userDTOs.size() > 1) {
			//処理１で2件以上取得できた場合は、「ApplicationException」を返す
			createApplicationException(M10190WS, SH_INFO);
		} else {
			userInfo = setUserInfo(userDTOs.get(0));
			if (null != password && "" != password && ! password.equals(userInfo.getpassword())) {
				createApplicationException(M00010WC, SH_INFO);
			}
			if(sesID==null){
				sesID="jsp";
			}
			recordLogin(userInfo.getusrid().toString(),sesID);
		}

		//検出データを返す
		return userInfo;
	}
	public void recordLogin(
			String loginId,
			String sessionId) {
		// ログイン情報を設定する
		TloginlgDTO tloginlgDTO = TloginlgDTO.setDefaultValue();
		tloginlgDTO.setLoginId(loginId);
		
		tloginlgDTO.setSessionId(sessionId);
		tloginlgDTO.setEventDate(getCurrentDate());
		tloginlgDTO.setEventTime(getCurrentTime());
		// LOGONLGにログイン情報を挿入する
		updateDAO.updateImmediately(TloginlgDTO.DELETE, tloginlgDTO);
		updateDAO.updateImmediately(TloginlgDTO.INSERT, tloginlgDTO);
	}
	private UserInfoDTO setUserInfo(MstusrDTO mstusrDTO){
		UserInfoDTO userInfo = new UserInfoDTO();
		userInfo.setfirstloginflg(mstusrDTO.getfirstloginflg());
		userInfo.setpassword(mstusrDTO.getpassword());
		userInfo.setstate(mstusrDTO.getstate());
		userInfo.settype(mstusrDTO.gettype());
		userInfo.setusername(mstusrDTO.getusername());
		userInfo.setusrid(mstusrDTO.getusrid());
		userInfo.setEmail(mstusrDTO.getemail());
		userInfo.setPhone(mstusrDTO.getphone());
		
		return userInfo;
	}
	
	public void UpdatePassword(Integer usr_id, String oldPassword, String password) {
		MstusrDTO userDTO = null;
		
		if (oldPassword != null && oldPassword.equals("")) {
			userDTO = new MstusrDTO();
			userDTO.setusrid(usr_id);
			userDTO.setpassword(oldPassword);
			List<MstusrDTO> userDTOs = queryDAO.queryForObjectList(MstusrDTO.EQUAL_SEARCH, userDTO);
			if (userDTOs.size() == 0) {
				createApplicationException(M10540WS);
			}
		}
		
		userDTO = new MstusrDTO();
		userDTO.setusrid(usr_id);
		userDTO.setpassword(password);
		
		updateDAO.updateOne(MstusrDTO.UPDATE, userDTO, M10190WS, SH_INFO);
	}
	
	public void UpdateEmail(Integer usr_id, String email) {
		//email重复check
		MstusrDTO userDTO = new MstusrDTO();
		userDTO.setemail(email);
		if(queryDAO.count(MstusrDTO.COUNT, userDTO) > 0){
			createApplicationException(M10060WC);
		}

		//email更新
		userDTO = new MstusrDTO();
		userDTO.setusrid(usr_id);
		userDTO.setemail(email);		
		updateDAO.updateOne(MstusrDTO.UPDATE, userDTO, M10190WS, SH_INFO);
	}

	public void UpdatePhone(Integer usr_id, String phone) {
		//phone重复check
		MstusrDTO userDTO = new MstusrDTO();
		userDTO.setphone(phone);
		if(queryDAO.count(MstusrDTO.COUNT, userDTO) > 0){
			createApplicationException(M10050WC);
		}

		//phone更新
		userDTO = new MstusrDTO();
		userDTO.setusrid(usr_id);
		userDTO.setphone(phone);		
		updateDAO.updateOne(MstusrDTO.UPDATE, userDTO, M10190WS, SH_INFO);
	}

	@Override
	public void deleteUser(String actionType,String userSql,Integer usr_id) {
		if(actionType.equals("single")){
			MstusrDTO mstusrDTO =new MstusrDTO();
			if(usr_id==null){
				return ;
			}
			mstusrDTO.setusrid(usr_id);
			updateDAO.updateOne(MstusrDTO.DELETE, mstusrDTO, M10190WS, SH_INFO);
			UserjurisdictionDTO  userjurisdictionDTO =new UserjurisdictionDTO();
			userjurisdictionDTO.setusrid(usr_id);
			updateDAO.update(SQLID.USER_JURISDICTION_DELETE_BY_USR_ID, userjurisdictionDTO);
		}else if(actionType.equals("many")){
			String[] dbSqlArray=userSql.split(",");
			for (int i = 0; i < dbSqlArray.length; i++) {
				if(StringUtil.isEmpty(dbSqlArray[i])){
					break;
				}
				MstusrDTO mstusrDTO =new MstusrDTO();
				mstusrDTO.setusrid(Integer.parseInt(dbSqlArray[i]));
				updateDAO.updateOne(MstusrDTO.DELETE, mstusrDTO, M10190WS, SH_INFO);
				UserjurisdictionDTO  userjurisdictionDTO =new UserjurisdictionDTO();
				userjurisdictionDTO.setusrid(Integer.parseInt(dbSqlArray[i]));
				updateDAO.update(SQLID.USER_JURISDICTION_DELETE_BY_USR_ID, userjurisdictionDTO);
			}
		}
	}
	
}
